package com.ia2014.tp.portal2.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.persistence.Transient;







import org.apache.log4j.Logger;

import com.ia2014.tp.portal2.vo.ArticuloVO;

@Entity
@Table(name="Articulos")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "categoria", discriminatorType = DiscriminatorType.STRING)  //The @DiscriminatorColumn annotation sets the field used to determine the subclass to the TYPE field and the field type to integer
public abstract class Articulo extends AbstractEntity<ArticuloVO>{
	@Transient
	private static Logger logger = Logger.getLogger(Articulo.class);
	
	private Integer id;
	private Integer idModulo;
	private Integer codigo;
	private String nombre;
	private String descripcion;
	private String marca;
	private String fotoURL;  // URL de la imagen
	private Double precio;
	private String origen;
	private Date fecha;
	private Integer ranking; //bestsellers
	

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	
	public Integer getIdModulo(){
		return this.idModulo;
	}
	
	@Column(name="codigo", nullable=false )
	public Integer getCodigo(){
		return this.codigo;
	}

	public void setIdModulo(Integer idModulo){
		this.idModulo = idModulo;
	}
	
	public void setCodigo(Integer codigo){
		this.codigo = codigo;
	}
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getMarca() {
		return marca;
	}

	public void setMarca(String marca) {
		this.marca = marca;
	}

	@Column(name="fotoURL", columnDefinition = "NVARCHAR(MAX)")
	public String getFotoURL() {
		return fotoURL;
	}

	public void setFotoURL(String fotoURL) {
		this.fotoURL = fotoURL;
	}

	public Double getPrecio() {
		return precio;
	}

	public void setPrecio(Double precio) {
		this.precio = precio;
	}

	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}
	
	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public Integer getRanking() {
		return ranking;
	}

	public void setRanking(Integer ranking) {
		this.ranking = ranking;
	}

	@Transient
	protected ArticuloVO getVOInstance() {
		return new ArticuloVO();
	}
	
	@Transient
	public ArticuloVO getVO() {
		
		try{
			ArticuloVO vo = getVOInstance();
		
			vo.setCodigo(this.getCodigo());
			vo.setIdModulo(this.getIdModulo());
			vo.setNombre(nombre);
			vo.setDescripcion(descripcion);
			vo.setPrecio(precio);
			vo.setOrigen(origen);
			vo.setMarca(marca);
			vo.setFotoURL(fotoURL);
			vo.setFecha(fecha);
			vo.setRanking(ranking);
			vo.setId(this.id);
		
			return vo;
		}
   		catch (Exception e){
   			logger.error("Error al tratrar de generar un Value Object de Articulo.\n Articulo: " + this.descripcion);
   			logger.error(e.toString());
   			logger.debug("Stacktrace", e);
   			return null;
   		}
	}

	@Transient
	public void setVO(ArticuloVO vo) {
		
		try{
			if (this.id == null) {
			
				this.setId(vo.getId());
			
			}
		
	
			this.setCodigo(vo.getCodigo());		
			this.setIdModulo(vo.getIdModulo());
			this.setNombre(vo.getNombre());
			this.setDescripcion(vo.getDescripcion());
			this.setPrecio(vo.getPrecio());
			this.setMarca(vo.getMarca());
			this.setOrigen(vo.getOrigen());
			this.setFotoURL(vo.getFotoURL());
			this.setFecha(vo.getFecha());
			this.setRanking(vo.getRanking());
		}
   		catch (Exception e){
   			logger.error("Error al tratrar de cargar el Articulo a partir de un Value Object.\n Articulo: " + vo.getDescripcion());
   			logger.error(e.toString());
   			logger.debug("Stacktrace", e);
   		}
	}
	
	@Transient
	public abstract boolean isArticuloElectrodomestico();
	
	@Transient
	public abstract boolean isArticuloInfantil();
	
	@Transient
	public abstract boolean isArticuloModa();
	
	@Transient
	public abstract boolean isArticuloMueble();

	@Transient
	public abstract String getCategoria();
}
